package org.dtrd.modules.service.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import org.dtrd.modules.patient.entity.bean.report.PatientServiceProgramme;
import org.dtrd.modules.service.entity.bean.PackagePatientListInfo;
import org.dtrd.modules.service.entity.bean.PatientPackageListInfo;
import org.dtrd.modules.service.entity.bean.PatientServiceIndexInfo;
import org.dtrd.modules.service.entity.po.DtrdRlPackagePatient;
import org.dtrd.modules.service.entity.request.PackagePatientPageRequest;

import java.util.Date;
import java.util.List;

/**
 * <p>
 * 患者和服务包关系表服务类
 * </p>
 *
 * @author QR
 * @since 2021-12-16
 */
public interface IDtrdRlPackagePatientService extends IService<DtrdRlPackagePatient> {

    /**
     * 查询关联记录
     *
     * @param patientId
     * @param packageId
     * @return
     */
    DtrdRlPackagePatient getPackageService(Integer patientId, Integer packageId);

    String getPackageServicePeriod(Integer patientId, Integer packageId);

    IPage<PackagePatientListInfo> pagePackagePatient(PackagePatientPageRequest request);

    /**
     * 查询是否有已完成的服务包
     */
    boolean hasFinishedServicePackage(Integer patientId);

    /**
     * 保存患者服务详情
     */
    boolean savePatientServiceDetailRelation(Integer patientId, Integer packageId, Integer relationId, Integer periodUnit);

    /**
     * 保存患者和服务包的关系
     *
     * @return
     */
    Integer savePatientPackageRelation(Integer patientId, Integer packageId, Integer periodUnit, Date startTime, Date endTime);

    /**
     * 获取用户服务中服务包
     *
     * @param patient
     * @return
     */
    DtrdRlPackagePatient getServicingPatientPackage(Integer patient);

    boolean removePackagePatient(Integer dataId);

    /**
     * 获取医生患者信息中的起始时间
     */
    String getPatientInfoStartTime(Integer patientId, Integer status);

    /**
     * 判断服务包是否已经关联患者
     *
     * @param packageId 服务包id
     * @return 判断结果，有关联返回 true
     */
    boolean checkPackageRelatePatient(Integer packageId);

    /**
     * 获取医生关联患者中购买体验服务包的人数
     *
     * @param doctorId  doctorId
     * @param packageId packageId
     * @return 医生关联患者中购买体验服务包的人数
     */
    int countDoctorPatientPackage(Integer doctorId, Integer packageId);

    /**
     * 获取患者非待服务的最新的服务记录
     */
    DtrdRlPackagePatient getLatestPatientPackage(Integer patientId);

    /**
     * 获取患者所有状态下的最新服务记录
     * @param patientId
     * @return
     */
    DtrdRlPackagePatient getAllStatusPatientPackage(Integer patientId);

    PatientServiceIndexInfo getPatientServiceIndexInfo(Integer patientId);

    /**
     * 分页查询患者的服务列表
     */
    IPage<PatientPackageListInfo> pagePatientPackage(Integer patientId,
                                                     Integer page,
                                                     Integer pageNum,
                                                     String orgCode,
                                                     Integer status);

    /**
     * 校验服务包
     */
    boolean isPackageServing(Integer packageId, List<Integer> serviceIds);

    /**
     * 更新服务项完成状态
     *
     * @param serviceItemId
     * @param remark
     * @param type
     * @param username
     * @return
     */
    boolean updateServiceItemState(Integer serviceItemId, String remark, Integer type, String username);

    /**
     * 查询患者进行中服务包开始与结束时间
     *
     * @param patientIds
     * @return
     */
    List<DtrdRlPackagePatient> getServicePackageDuration(String patientIds);

    /**
     * 结束服务包
     *
     * @param po
     * @param servicePackageId 服务包ID
     * @param executorId       执行人ID
     * @param executorName     执行人 名称
     * @param serviceEffect    管理成效
     * @param serviceEndDesc   备注
     * @return
     */
    boolean finishedServicePackage(DtrdRlPackagePatient po, String servicePackageId, String executorId, String executorName, String serviceEffect, String serviceEndDesc);

    List<DtrdRlPackagePatient> getTimePeriodConflict(Integer patientId, Date serviceStartTime, Date endTime);

    String checkServicePackageValid(Integer patientId, Date serviceStartTime, Date endTime);

    List<Integer> getServicingPatientIds();

    PatientServiceProgramme getPatientServiceProgramme(Integer patientId);
}
